package servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.swim.entity.Abilita;
import org.swim.entity.Amicizia;
import org.swim.entity.Notificabile;
import org.swim.entity.PropostaAbilita;
import org.swim.entity.RichiestaAiuto;
import org.swim.entity.Status;
import org.swim.entity.Utente;
import org.swim.sessions.GestoreAbilitaRemote;
import org.swim.sessions.GestoreRichiestaAiuto;
import org.swim.sessions.GestoreRichiestaAiutoRemote;
import org.swim.sessions.GestoreUtenti;
import org.swim.sessions.GestoreUtentiRemote;


/**
 * Servlet implementation class Azioni
 */
public class Azioni extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Azioni() {
        super();
        // TODO Auto-generated constructor stub
    }
    //TODO incpnsistente??
    private enum Comando{
    	AMICIZIA,
    	AIUTO,
    	FEEDBACK,
    	MODIFICA_PROFILO,
    	MODIFICA_PASSWORD,
    	ABILITA_PERSONALI,
    	PROPOSTA_ABILITA,
    	ABILITA,
    	NOTIFICA
    }
    private String comando(String idUtente, HttpServletRequest request, InitialContext ctx) throws Exception{
		GestoreUtentiRemote gestore;
		GestoreRichiestaAiutoRemote aiuto;
		Comando comando;
		String mode;
		String id;
		try {
			comando = Comando.valueOf(request.getParameter("comando").toUpperCase());
		} catch (Exception e) {
			return "Comando errato "+ e;
		}
		switch (comando) {
		case MODIFICA_PROFILO:
			String [] paramK = {"password","nome","cognome","citta","dataNascita"};
			Hashtable<String,Object> parametri = new Hashtable<String,Object>();
			for(String k : paramK){
				String p = request.getParameter(k);
				if(p != null && !p.equals("")) parametri.put(k, p);
			}
			
			gestore = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
			gestore.changeDati(idUtente, parametri); 
			
			return "{\"commit\":true}";
		case MODIFICA_PASSWORD:
			String p = request.getParameter("password");
			if(p == null) throw new Exception("Errore Password");
			if(p.equals("")) throw new Exception("Errore Password");
			
			gestore = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
			gestore.changePassword(idUtente, p); 
			return "{\"commit\":true}";
		case ABILITA_PERSONALI:
			String nome = request.getParameter("nome");
			mode = request.getParameter("mode");
			
			gestore = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
			if(mode.equals("aggiungi"))gestore.addAbilita(idUtente, nome); 
			else if(mode.equals("rimuovi"))gestore.removeAbilita(idUtente, nome);
			
			return "{\"commit\":true}";
		case AMICIZIA:
			id = request.getParameter("id");
			mode = request.getParameter("mode");
			gestore = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
			if(mode.equals("aggiungi"))		gestore.addAmicizia(idUtente, id); 
			else if(mode.equals("rimuovi"))	gestore.removeAmicizia(idUtente, id);
			
			return "{\"commit\":true}";
		case AIUTO:
			id = request.getParameter("id");
			mode = request.getParameter("abilita");
			String descrizione = request.getParameter("descrizione");
			aiuto = (GestoreRichiestaAiutoRemote)ctx.lookup("GestoreRichiestaAiuto/remote");
			Hashtable<String,String> h = new Hashtable<String,String>();
			h.put("mittente", idUtente);
			h.put("destinatario", id);
			h.put("abilita", mode);
			h.put("descrizione", descrizione);
			aiuto.addRichiesta(h);
			return "{\"commit\":true}";
		case NOTIFICA:
			Notificabile.TipoNotifica tipo;
			Status status;
			try{
				id = request.getParameter("id");
				status = Status.valueOf(request.getParameter("status").toUpperCase());
				tipo = Notificabile.TipoNotifica.valueOf(request.getParameter("tipo").toUpperCase());
			} catch (Exception e) { return ("Errore Parametri errati "+ e); }
			switch (tipo) {
			case RICHIESTA_AIUTO:
				aiuto = (GestoreRichiestaAiutoRemote)ctx.lookup("GestoreRichiestaAiuto/remote");
				aiuto.valutaRichiesta(new Integer(id),status);
				break;
			case PROPOSTA_ABILITA:
				GestoreAbilitaRemote g = (GestoreAbilitaRemote)ctx.lookup("GestoreAbilita/remote");
				if(status == Status.ACCETTATA)g.accettaProposta(id);
				else g.rifiutaProposta(id);
				break;
			case RICHIESTA_AMICIZIA:
				gestore = (GestoreUtentiRemote)ctx.lookup("GestoreUtenti/remote");
				gestore.valutaAmiciziaById(new Integer(id),status);
				break;
			default:
				return "Notifica sconosciuta";
			}
			
			return "{\"commit\":\""+status + tipo + id +"\"}";
		case FEEDBACK:
			id = request.getParameter("id");
			Integer rate = new Integer(request.getParameter("rate"));
			String commento = request.getParameter("commento");
			
			aiuto = (GestoreRichiestaAiutoRemote)ctx.lookup("GestoreRichiestaAiuto/remote");
			aiuto.addFeedback(new Integer(id), commento, rate);
			return "{\"commit\":true}";
		case PROPOSTA_ABILITA:
			id = request.getParameter("id");
			GestoreAbilitaRemote h2 = (GestoreAbilitaRemote)ctx.lookup("GestoreAbilita/remote");
			h2.addProposta(idUtente, id);
			return "{\"commit\":true}";
		}
		return "Comando sconosciuto";
    }
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out = response.getWriter();
		HttpSession session = request.getSession();
		
		String idUtente = (String) session.getAttribute("idUtente");
		if(idUtente == null){ 
			out.println("{\"error\":ture}"); return;
		}

		Hashtable<String,String> env = new Hashtable<String,String>();
		env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
		env.put(Context.PROVIDER_URL,"localhost:1099"); 
		try {
			out.println(comando(idUtente,request,new InitialContext(env)));
		} catch (Exception e1){ 
			e1.printStackTrace();
		}


		

		//ArrayList<String> l = new ArrayList<String>(); for(Integer i = 0; i< 10; i++){ l.add(i.toString()); }


	}

}
